package br.com.flavios.selenium;

import static org.junit.Assert.fail;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

import br.com.flavios.selenium.entity.Capitulo;
import br.com.flavios.selenium.entity.Livro;
import br.com.flavios.selenium.entity.Testamento;
import br.com.flavios.selenium.entity.Versiculo;
import br.com.flavios.selenium.parse.WebElementParse;

public class App {
	private WebDriver driver;
	private String baseUrl;
	private boolean acceptNextAlert = true;
	private StringBuffer verificationErrors = new StringBuffer();

	public static void main(String[] args) throws Exception {
		App t = new App();
		t.setUp();
		t.testE();
		t.tearDown();
	}

	public void setUp() throws Exception {
		driver = new FirefoxDriver();
		baseUrl = "http://www.bibliaonline.com.br/";
		driver.manage().timeouts().implicitlyWait(45, TimeUnit.SECONDS);
	}

	private void abrirLink(String url) {
		driver.get(url);
	}
	
	private void voltar() {
		driver.navigate().back();
	}

	public void testE() throws Exception {
		abrirLink(baseUrl);
		List<WebElement> books = driver.findElements(By.className("books"));
		List<Testamento> testamentos = new ArrayList<Testamento>();

		int indice = 0;
		// painel de testamento
		for (WebElement book : books) {
			List<WebElement> divBlocos = book.findElements(By.tagName("div"));

			indice++;
			Testamento testamento = WebElementParse.toTestamento(indice==1?"Velho Testamento": "Novo Testamento");
			testamentos.add(testamento);
			
			// testamento
			for (WebElement bloco : divBlocos) {

				List<WebElement> livros = bloco.findElements(By.tagName("a"));

				// livros
				for (WebElement linkLivros : livros) {
					
					Livro livro = WebElementParse.toLivro(linkLivros);
					testamento.getLivros().add(livro);
					System.out.println("Abrindo página do livro: " + livro.getDescricao());
					
					
					abrirLink(livro.getLink());
					WebElement divCaps = driver.findElement(By.className("chapters"));
					List<WebElement> linkCaps = divCaps.findElements(By.tagName("a")); 
					
					//capitulos
					for (WebElement cap : linkCaps) {
						Capitulo capitulo = WebElementParse.toCapitulo(cap);
						livro.getCapitulos().add(capitulo);
						System.out.println("Lendo capítulo: " + capitulo.getNumero());
						
						
						abrirLink(capitulo.getLink());
						WebElement divVerso = driver.findElement(By.className("verses"));
						List<WebElement> vers = divVerso.findElements(By.tagName("p")); 
						
						for (WebElement ver : vers) {
							Versiculo versiculo = WebElementParse.toVersiculo(ver);
							capitulo.getVersiculos().add(versiculo);
							System.out.println(versiculo.getNumero()+ " - " + versiculo.getTexto());
						}
						System.out.println("-------------------------------------------------------------------------");
						voltar();
					}
					
					voltar();
				}
			}

		}
	}

	public void tearDown() throws Exception {
		driver.quit();
		String verificationErrorString = verificationErrors.toString();
		if (!"".equals(verificationErrorString)) {
			fail(verificationErrorString);
		}
	}

	private boolean isElementPresent(By by) {
		try {
			driver.findElement(by);
			return true;
		} catch (NoSuchElementException e) {
			return false;
		}
	}

	private boolean isAlertPresent() {
		try {
			driver.switchTo().alert();
			return true;
		} catch (NoAlertPresentException e) {
			return false;
		}
	}

	private String closeAlertAndGetItsText() {
		try {
			Alert alert = driver.switchTo().alert();
			String alertText = alert.getText();
			if (acceptNextAlert) {
				alert.accept();
			} else {
				alert.dismiss();
			}
			return alertText;
		} finally {
			acceptNextAlert = true;
		}
	}
}
